home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1992 June: ROMin Holiday / ADC Developer CD (1992-06) (''ROMin Holiday'')_iso / Developer Connection - 06-1992.iso / Development Platforms / Apple II / Essentials / rTutors / Detailed.Docs / Rez.101 next >
Encoding:
Text File  |  1990-06-23  |  26.1 KB  |  470 lines  |  [TEXT/pdos]

  1. Rez 101
  2. by: Tim Swihart
  3.  
  4.  
  5. So, you've heard how great resources are and how much easier they can 
  6. make software development.  You're eager to find out what resources can do 
  7. for you, then suddenly, it hits you - you're not even sure what resources 
  8. ARE!
  9.  
  10. Even the best sample source code fails if the reader doesn't understand the 
  11. concepts BEHIND that source.  Why were certain tool calls used?  How did the 
  12. author decide which calls to use (there are roughly a thousand tool calls to 
  13. choose from)?  Why did the author use certain resource types and not 
  14. others?  Where do you go to learn more about all of this?
  15.  
  16.  
  17. Step Right Up!
  18.  
  19. I'll tackle answering those questions and others like them in this file and in 
  20. others to follow.  Along the way, I'll point out other sources of more detailed 
  21. information (to help you learn faster), I'll mention trade offs between doing 
  22. things one way or doing them another, I'll cover various development tools 
  23. that help make resources easier, and I'll try to do it all at a level that just 
  24. about anyone can understand.
  25.  
  26. In GEnie's A2Pro library and in America Online's ADV library are a series of 
  27. source code samples that I wrote showing how to use resources in IIGS 
  28. applications.  This file is intended to explain Part 1 of the APW C-based Rez 
  29. tutorial that I've uploaded to those libraries (if you don't have those files 
  30. handy, then you should get them, it'll make this file more valuable).  Later 
  31. files will detail Part 2, Part 2.5, Part 3, etc of the resource tutorial files.  That 
  32. way, you have one detailed explanation for each part of the sample source.
  33.  
  34. Future versions of this detailed explanation will ONLY explain the things that 
  35. are NEW to whatever part they're supposed to "match".  That means that the 
  36. detailed explanation for Part 2 won't contain this background information 
  37. and it won't talk about starting up the tools (Part 1 will do that).  You should 
  38. be prepared to read each of the files in this series in order to understand all 
  39. of what's involved in using resources in your own applications.
  40.  
  41.  
  42. The Problem:
  43.  
  44. All Apple IIGS programs that use the Toolbox need to use certain data 
  45. structures like menu bars, window templates, icons, strings, etc.  The original 
  46. way to handle these within an application was to hard code it inside the 
  47. source files to the applications themselves.  If you wanted to rename a 
  48. menu, change the title of a window, make a window bigger or smaller, etc, 
  49. then you had to edit your source, compile it, link it, run it, and repeat until 
  50. you achieved the desired affect.
  51.  
  52. What if you wanted to do a French version of your application?  You had to 
  53. go back into your source code to try it all out, you had to once again use trial 
  54. and error to get your controls to line up (their sizes would change no doubt if 
  55. the text within them changed to a new language).
  56.  
  57. This "edit/compile/link/run/repeat" method was usually VERY time 
  58. consuming.  Linking large applications can be very time consuming, 
  59. recompiling source code over and over is also very time consuming, but 
  60. there just weren't any other ways to do it.
  61.  
  62. Changing the user interface to your applications was a nightmare.  Many 
  63. developers just didn't bother to fix "holes" in their user interface because 
  64. they were tired of recompiling just for minor tweaks.
  65.  
  66. What if there was a special place you could store the templates for all of 
  67. these structures?  What if there was a special place you could put all of the 
  68. text strings that your applications use?  What if there was a faster way to 
  69. create things like windows, menus, etc?  What if it were possible to make 
  70. sweeping changes to the user interfaces within seconds - without "breaking" 
  71. your application?
  72.  
  73. What if we defined a special part of the file to contain nothing more than the 
  74. collection of these structures and their contents?  How would your 
  75. application be able to tell one structure from another?  How would you 
  76. access these structures?  How would you create them?
  77.  
  78.  
  79. Enter Resources:
  80.  
  81. Since the introduction of Apple IIGS System Disk v.5.0.2, there IS a special 
  82. place for keeping all of these "things" that need to be tweaked, converted to 
  83. foreign languages, embellished, etc.  This special place is known as the 
  84. "resource fork" of a file.
  85.  
  86. Each structure within your application COULD (they don't HAVE to) now be 
  87. placed in another portion of your application (the resource fork).  The 
  88. Resource Manager takes care of keeping track of where within the file your 
  89. structure lives and loads it into memory for you when you need it.  Each of 
  90. these individual structures living in the resource fork are called "resources".  
  91. So, the simple definition of a resource is data that is needed for your 
  92. application.
  93.  
  94. Individual resources are kept track of by the Resource Manager because 
  95. EVERY resource has a specific "type" and a specific "ID" (you assign the ID, 
  96. what you're trying to use the resource for defines the type).  Apple defined 
  97. the most commonly used types and published the definitions for those types 
  98. in Apple IIGS Toolbox Reference Manual, Volume 3 (available as I type this 
  99. in beta form from APDA and soon to be available in "final" form from 
  100. Addison-Wesley at better bookstores and [of course] at APDA).
  101.  
  102. For the sake of those of you who don't have Toolbox Reference Volume 3, I'll 
  103. BRIEFLY describe each type of resource when ever it gets added to the 
  104. resource tutorial application.  I will not go into tons of detail (Volume 3 is 
  105. over a thousand pages and I'm not going to paraphrase that much!).  If you 
  106. need more information or explanation that I've provided, then you should 
  107. either post a specific question either in A2Pro or ADV or get Volume 3 and 
  108. read what Apple says (it's a great book to have <hint, hint>).
  109.  
  110.  
  111. How Do Resources Get Used?
  112.  
  113. If you need a specific resource in memory, you can tell the Resource 
  114. Manager to load it by making the tool call "LoadResource".  It's fairly rare 
  115. that you have to use LoadResource yourself!!!  Why?  Because most of the 
  116. standard resource types are loaded for you when you make specific calls to 
  117. OTHER tool sets (such as the Window Manager or the Menu Manager)!  The 
  118. resource sample source code (up through Part 3.2) does NOT use 
  119. LoadResource - it's simply not needed.
  120.  
  121. System Disk 5.0 introduced a number of new tool calls to several toolbox 
  122. Managers so that these Manager could support resources.  You create a 
  123. window the old way by calling "NewWindow".  You create a window using 
  124. resources by calling "NewWindow2" (notice the "2" on the end of the call).  
  125. Using the old way, you would add menus to your application by calling 
  126. NewMenuBar and then adding the menus one by one by calling InsertMenu 
  127. on each of them (ugh!  sounds like a lot of work).  Using resources, you can 
  128. install a menu bar, its menus, and all of the items within those menus with 
  129. ONE call - NewMenuBar2.  (ahhh, much easier!)
  130.  
  131. So, the answer to "How do I use resources?" is simply create the resources 
  132. your application will need and let the toolbox use them for you.  You simply 
  133. pass references to the resources to the toolbox and the computer takes it 
  134. from there.
  135.  
  136.  
  137. What's A Reference?:
  138.  
  139. Before we go any further, let's look at a new data type that we need to 
  140. understand.  The new tool calls can your resources for the information they 
  141. need or they can use structures that you already have in memory (or that 
  142. you hard coded within your application).  These calls can accept either a 
  143. handle to the data structure you want to use, a pointer to the data structure, 
  144. or the ID of the resource you want to use.  This handle/point/resource ID is 
  145. referred to as a "reference".  In other words, a reference is the way that the 
  146. toolbox gets to the actual data structure.
  147.  
  148. How does the toolbox know whether you've passed a pointer, a handle, or a 
  149. resource ID?  Simple, YOU tell the toolbox what you're passing, every time 
  150. you pass it!  Each tool call that accepts a reference also REQUIRES that you 
  151. tell it what kind of reference you've passed!
  152.  
  153. The bits that describe the type of reference passed is called a "reference 
  154. descriptor" or simply a "refDesc".  Toolbox Volume 3 has more details and 
  155. explains the bit patterns used for the different types of reference 
  156. descriptors.  Since I'm trying to teach you about resources, all of the 
  157. resource-related tool calls I've used have resource ID's as their reference.
  158.  
  159.  
  160. Tools to Help:
  161.  
  162. There are several ways to create resources.  The first tool that was available 
  163. to developers is a "resource compiler" from Apple named "Rez".  Rez takes 
  164. text descriptions of resources and converts them into actual resources (which 
  165. is why it's called a "compiler").  Since Rez takes text files as input, it's very 
  166. easy to upload resources TODAY to share with others - you simply upload 
  167. the text description and the downloaders compile it to create the actual 
  168. resources (this gets around the problem of current file packer's not being 
  169. able to cope with FILES that have resources).  You can also put the resources 
  170. themselves on a disk and pack the disk for uploading, but when sending 
  171. sample source code, the text version is often faster (because you only pack 
  172. the files, not the whole disk).  Also, the text-based descriptions of resources 
  173. help newer developers unravel the structure of resources.
  174.  
  175. Creating things like windows filled with controls by typing in text 
  176. descriptions is often cumbersome.  That's where desktop applications like 
  177. SSSi's "GeneSys" comes in handy.  GeneSys (and competing programs not yet 
  178. released) let you "draw" your window, menus, controls, etc on the desktop 
  179. (so you can see what they look like immediately) and GeneSys creates either 
  180. the Rez source for you or creates the resources directly.
  181.  
  182. Rez can do things no other tool can do yet - such as combining several 
  183. resource forks into one, easily supporting custom resources types, reading 
  184. data files and saving them as resources (so you can move sampled sounds, 
  185. pictures, etc into resources easily).  So, Rez should be in every developer's 
  186. arsenal of tools!
  187.  
  188. The package of tools that Rez comes in includes a resource decompiler (called 
  189. DeRez).  DeRez allows you to convert existing resources back into text 
  190. descriptions.  If you use a different tool to create your resources directly, 
  191. then you can convert those resources to text using DeRez.  Why would you 
  192. want to do this?  Several reasons, this protects you from anything that 
  193. trashes your resource fork (if your resources get trampled, simply use Rez to 
  194. recompile them - this is called "Rez-urrecting your resource fork").  You can 
  195. also do this as an easier way to "archive" your application's source code.
  196.  
  197. Many tasks require a more visually oriented tools (such as GeneSys) to get 
  198. the job done quickly.  So having BOTH Rez and a desktop tool like GeneSys 
  199. should be seriously considered!  If you decide to not have both, then 
  200. consider again.  It's that important.
  201.  
  202. The resource tutorials that I've uploaded, and the descriptions like this file 
  203. all assume that you have Rez.  If you don't have Rez then you can get it by 
  204. calling either Developer Tools Express or APDA (if you don't belong to APDA, 
  205. then call Developer Tools Express).  Both APDA and Developer Tools Express 
  206. use the same phone number (1-800-282-2732 from U.S., 1-800-637-0029 
  207. from Canada, and 408-562-3910 from International).  Tell them you want to 
  208. order part number A0240LL/A (price is fifty dollars).  This package includes 
  209. a collection of tools for use with the APW and ORCA shells that are used 
  210. throughout this tutorial series.
  211.  
  212.  
  213. Every App Has To...:
  214.  
  215. Every Apple IIGS application that wants to use the Toolbox has to start up 
  216. the individual tool sets that the application expects to use.  The application 
  217. also has to start up any tool sets that are needed by the tool set the app 
  218. wants to use (you many not care about the Memory Manager, bu you can bet 
  219. the other tools do!).  These tools have to be started up in just the right order 
  220. - that order is listed in a tech note, several books, etc, so it is fairly easy to 
  221. find this out.  Some of the tool sets need some memory in bank zero (called 
  222. direct page space) and the starting points of each tool's direct page space has 
  223. to be passed to the tools as they are started up.  Before you can pass this 
  224. direct page space, you have to request it.  
  225.  
  226. Starting up tools in this way is an ugly process, you have to know the right 
  227. order to start things up in, you have to request direct page space from the 
  228. Memory Manager, and you have to pass this space to the tools as you start 
  229. them up one by one.  It would sure be a LOT easier if we could just make a 
  230. list of what tools we want started up and have the computer figure out how 
  231. much direct page space was needed, get the direct page space for us and 
  232. start the tools for us as well.  That would let us make ONE tool call to start 
  233. ALL of the tools our application needs!
  234.  
  235. Well, System Disk 5.0 introduced just such a tool call.  It's called 
  236. "StartUpTools" (naturally) and it makes life a LOT easier for us!  Now, to start 
  237. all of the tools your application will need, simply make a list (the format for 
  238. this list is given in Toolbox Reference, Volume 3), and  pass your user ID 
  239. (which you get from the Memory Manager), a reference descriptor (so 
  240. StartUpTools knows whether it's getting a pointer, a handle, or a resource 
  241. ID), a reference to this list.  We're showing how to use resources so the 
  242. reference descriptor we use is "refIsResource" (this is a constant defined in 
  243. the interfaces files by Apple).  The reference we pass is the resource ID of 
  244. the tools list (which lives in the resource fork).
  245.  
  246.  
  247. What's in the tools list?:
  248.  
  249. Earlier in this file, I told you that the type of the resources you use is 
  250. dictated by what you want to do with that resource.  In order to use a tool 
  251. list in a resource to start all of the tools, it has to be of type "rToolStartup".  
  252. This name (rToolStartup) is a constant defined in the Types.Rez interface file.  
  253. In order to create a resource of this type, we create a text file (see the 
  254. "rTutor.Rez" file) that contains a line telling Rez to include (i.e.: read in) the 
  255. standard resource types file (called "Types.Rez") and then we can describe 
  256. the actual resource itself using the syntax that Rez expects to see.
  257.  
  258. Comments in Rez source files can be in either of two formats.  If you see a 
  259. pair of slashes (i.e.:  //) then that means the rest of that line is treated by 
  260. Rez as a comment and ignored.  If you see a slash followed immediately by 
  261. an asterisk (i.e.:  /*), then that starts a comment - to end that comment, Rez 
  262. has to see an asterisk followed by a slash (i.e.:  */).  This second form can be 
  263. as long as you want it and can span multiple lines.  I'll use either type in my 
  264. Rez source throughout the tutorial, so be sure you remember both of them.
  265.  
  266. If we strip all of the comments out of the rTutor.Rez file, we're left with the 
  267. "#include Types.Rez" line (which we already discusses) and a funny looking 
  268. structure that starts with "resource rToolStartup (1)".  This funny looking 
  269. structure is how we tell Rez what we want in the various parts of the tool 
  270. startup list.
  271.  
  272. The word "resource" at the beginning of the line simply tells Rez that we're 
  273. starting the description of a resource and that we'll use a template (from 
  274. Types.Rez this time, but we can also define our own if we'd rather) to 
  275. describe the parts of this resource.  It's possible to create resources by just 
  276. passing Rez a bunch of bytes of data - those types of resources start off with 
  277. "data" instead of "resource".
  278.  
  279. The next thing on the line we're talking about is "rToolStartup" - this is the 
  280. TYPE of the resource we're about to describe.  Remember, the type is 
  281. dictated by what you want to do with it - we want to start up the tools so we 
  282. HAVE to use the type of "rToolStartup".  The "(1)" is the resource ID we've 
  283. assigned to this tool startup list.  Since all resources are described by BOTH a 
  284. type AND an ID, you can have multiple resources of the same TYPE (because 
  285. they'll all have different ID's) and of the same ID (as long as their types are 
  286. different).
  287.  
  288. Why did I give this resource an ID of 1?  Why not use 4129?  Or some other 
  289. number?  I like to keep tutorial source simple, so I tend to number resources 
  290. starting from 1 (which I use for the first resource of that type).  I use a 
  291. different numbering system for menus because you have to keep track of 
  292. menu bars, menus, menu items, and the text strings that all of them use.  
  293. The best way to do all of this is to define your own constants and use the 
  294. constants between the parenthesis!  i.e.:  instead of using "1", I should have 
  295. put  "#define firstStartupList 1"  in my Rez source ABOVE the "resource 
  296. rToolStartup..." line.  Then, I could have changed the "resource 
  297. rToolStartup..." line to be:  "resource rToolStartup (firstStartupList)"  Since 
  298. applications tend to have only one startup tools list, this isn't that big of a 
  299. deal, but later on (when we get into menus) you'll see that this technique is 
  300. almost mandatory in order to figure out what's going on.
  301.  
  302. The curly brace ("{") tells Rez that we're starting the description of the 
  303. rToolStartup list.  The "$C080" that's on the next line is a hex number that 
  304. Rez uses in the first field of the tool startup list.  This field tells the toolbox 
  305. whether your app wants to come up in 320 or 640 mode and allows you to 
  306. set other QuickDraw attributes (if you want to know them all, see Toolbox 
  307. Ref, Volume 3).
  308.  
  309. A comma separates items within the test that describes the resource.  We 
  310. could cram everything onto one long line and Rez could figure it out.  I like 
  311. to be able to read what I've done (so I can catch errors), so I've manually 
  312. formatted the listing.
  313.  
  314. Let's think for a minute - how many tools are we going to start up?  Will it 
  315. always be the same number for EVERY application?  How do we tell the 
  316. toolbox that we only want to start up 17 of the tools (there are many more 
  317. than just 17)?  Obviously, we have to tell the toolbox how many items are in 
  318. our list of tools.  That can easily lead to errors if we have to count the 
  319. number of tools our selves and put that number in a list.  Adding a tool and 
  320. forgetting to change the number could cause weird problems.
  321.  
  322. Fortunately, Rez is smart enough to be able to count for us!  So, instead of 
  323. having to count the number of tools we want to start, we let Rez do it.  (this 
  324. requires some special fields in the template, if you want to know how it's 
  325. done, see the Rez chapter of the APW Tools manual).  Since the template 
  326. takes care of whatever it is that's needed to make this auto-counting happen, 
  327. we only have to open another layer of curly braces and list all of the tools.  
  328. So, the next line of the Rez source is simply another curly brace ("{") and 
  329. then comes the list of tools.
  330.  
  331. Notice that each line has TWO numbers on it (separated by commas).  The 
  332. first number is the tool set's number (assigned by Apple) and the second 
  333. number is the minimum version of that toolset that our application is willing 
  334. to accept.  "4, $0302" means that we must be able to start at least version 3.2 
  335. of tool set #4 (QuickDraw).  The "$" tells us the numbers after it are hex, the 
  336. lack of any special characters in front of the "4" tell us that it's just a plain 
  337. old decimal number.  For details on how version number are decoded, look in 
  338. the Toolbox Reference Manual (Volume 2 I believe).
  339.  
  340. Why is the version number important????  As the IIGS's tools have become 
  341. more mature over the years, new calls have been added.  If you start up an 
  342. old version of the tools, the calls you make may NOT have been implemented 
  343. yet!  That means your application will fail in some weird place!  If you check 
  344. the version numbers at startup, you'll know THEN whether or not all of the 
  345. tool calls your application uses are implemented!  Early versions of the Rez 
  346. tutorial allows many of the version numbers to be MUCH lower than they 
  347. should be (i.e.:  it uses version 1.0 for things that should be 2.0 or higher).  
  348. This will be fixed in whatever comes AFTER Part 3.2 (3.2 is already released, 
  349. so there's no way to fix it until the next version is released).
  350.  
  351. In your applications, be sure you check the version numbers!!!! 
  352.  
  353. After we've listed all of the tools the tutorial app needs started, we have to 
  354. close the list with a curly brace ("}").  This marks the spot for Rez to stop 
  355. counting (now Rez can fill in the count field for us).  A second curly brace 
  356. ("}") is needed to close the complete resource description (remember, we had 
  357. two opening braces, so we HAVE to have two closing braces.  A semicolon is 
  358. added after the last closing brace to tell Rez the resource has been 
  359. completely described.
  360.  
  361.  
  362. That's It for The Resource Fork:
  363.  
  364. Part 1 of the Rez tutorial only includes ONE resource (the list used to start up 
  365. the tools).  Later part of this tutorial will add additional resources (and will 
  366. NOT describe the rToolStartup resource).
  367.  
  368. Since the resource fork of Part 1 has now been fully described, it's time to 
  369. look at what's needed from within the application itself in order to use the 
  370. rToolStartup resource we just created.
  371.  
  372.  
  373. The Application Itself:
  374.  
  375. At this stage of the game, the application is only supposed to start up the 
  376. tools, indicate that it succeeded and shut the tools back down.  I made the 
  377. application beep three times to indicate success.  If the startup fails, you get 
  378. no beeps.  Either way, the tools are shutdown and the application quits back 
  379. to the launching program.  Your only indications of success are the brief view 
  380. of the desktop and the three beeps.  Don't be surprised if the brief view of 
  381. the desktop does NOT have any menus showing - those don't get added until 
  382. Part 2.  
  383.  
  384. There are two routines in the APW C source code file that make up Part 1 of 
  385. the Rez tutorial application.  All applications built with C need a routine 
  386. named "main".  The other routine is named "do_init_rom" and that's where 
  387. we actually call StartUpTools.  Since "do_init_rom" is called from within 
  388. "main", we have to put "main" AFTER "do_init_rom", otherwise, the compiler 
  389. will complain that it doesn't know what to do with the call to "do_init_rom" 
  390. because the compiler has NOT yet seen a definition for "do_init_rom".  So, if 
  391. you're not a C fan, but you're studying this source anyways to learn about 
  392. resources, you should now be able to tell what the different routines are for.
  393.  
  394. "main" has about five lines of meaningful code (I'm ignoring comments and 
  395. braces).  The first one is simply a call to our routine that starts up the tools.  
  396. I put the call to StartUpTools in a separate routine simply to make "main" 
  397. easier to read.  The second line tests the value of a boolean variable to 
  398. determine whether or not the tools were successfully started up.
  399.  
  400. If the startup was successful, then we make three calls to SysBeep (SysBeep 
  401. is a toolbox routine that simply beeps once each time it's called).  After the 
  402. beeps, we shut down the tools by calling "ShutDownTools".  If the startup 
  403. failed, then we skip the three calls to SysBeep and immediately shut down 
  404. the tools.
  405.  
  406. ShutDownTools is a toolbox routine and is fully documented in IIGS Toolbox 
  407. Reference Volume 3.  This tool requires two parameters.  The first one is a 
  408. reference descriptor (which I explained earlier).  The second parameter is 
  409. the reference to the "StartStopRecord" that StartUpTools returned to us when 
  410. we called it.  The contents of a StartStopRecord are beyond the scope of this 
  411. explanation (you can survive just fine for now without knowing what they 
  412. are).
  413.  
  414. Notice that the reference descriptor indicates the the reference we're passing 
  415. to ShutDownTools is a HANDLE.  I said earlier that we'd only be dealing with 
  416. reference descriptors that are resources.  Well, I was wrong.  <grin>  Since 
  417. the StartStopRecord is initialized by calling StartUpTools and is only used 
  418. again by ShutDownTools, I made it a regular variable.
  419.  
  420. If you examine the contents of the "do_init_rom" routine, you'll see that it 
  421. contains about six lines (ignoring comments and braces) of meaningful code.  
  422. The first line gets our user ID from the Memory Manager.  Under APW C, this 
  423. is actually done for use by the code in the "start.root" file that we have to 
  424. link with, so we can grab the "built in" variable's value and use it here.  
  425. Users of ORCA/C may have to change "_ownerid" to what ever ORCA/C uses 
  426. or replace it with a call to MMStartup (Memory Manager Startup routine).
  427.  
  428. What?  Start the Memory Manager again?  Won't that fry it if we start it and 
  429. it's already started?  Turns out that MMStartup doesn't actually start the 
  430. Memory Manager, it simply returns the user ID of whatever called it.  So, 
  431. we're safe calling MMStartup as often as we want to.
  432.  
  433. The next line of code is the call to StartUpTools and it requires the three 
  434. parameters I described much earlier.  StartUpTools returns a reference to 
  435. the StartStopRecord we talked about a little bit ago.  This reference is a 
  436. handle and is need for the ShutDownTools calls right before we quit this 
  437. application.
  438.  
  439. After we've called StartUpTools, we need to check for errors.  Was our tool 
  440. list correct?  Did we pass all the right parameters to the call?  (remember, 
  441. the resource ID we pass is a LONG, don't forget to pass ALL of that LONG, 
  442. passing only a WORD will cause StartUpTools to fail!).  If the call worked, we 
  443. set the boolean "gPunt" to FALSE.  If there was an error returned by 
  444. StartUpTools, then we set "gPunt" to TRUE.
  445.  
  446. "gPunt" is a global (that's why it starts with "g" - that's a naming convention 
  447. I use) variable that we'll use in various places within the application later 
  448. on.  Once we've added an event loop (Part 2.5), we'll use gPunt to determine 
  449. when it's time to quit the application.
  450.  
  451.  
  452. Th-th-th-that's All Folks!
  453.  
  454. I've described in pretty intricate detail how Part 1 of the Rez tutorial works.  
  455. I've described what a resource is and given examples of how to use and 
  456. define them.  I've also talked about a couple of tools that are used to create 
  457. resources.  More details on Rez and on GeneSys can be found on both GEnie's 
  458. A2Pro and on America Online (Rez is under ADV and GeneSys is in the SSSi 
  459. section).
  460.  
  461. If you have further questions, send me email (try the others first), post in 
  462. the appropriate topic/folder, or read the manuals.  Details on the Resource 
  463. Manager and all of the new 5.0 tool calls that support resources are 
  464. documented in Apple IIGS Toolbox Reference, Volume 3.  Rez is documented 
  465. in the manual that comes with "APW Tools & Interfaces".  Enjoy!
  466.  
  467.  
  468. Tim S.
  469.  
  470.